/**仿QQ聊天软件实现*/
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <pthread.h>
#include "DefaultUtils.h"
#include "ServeUtils.h"
#include "SConsoleStats.h"
#include "FTPServices.h"
#include  "StructList.h"

#define QLEN 64
#define INETERVAL 5 /**超时时间*/
#define SLEEP_TIME 1
#define MASTER_PORT 13099
extern int errno;

/**规定
*argv[1] port
* argv[2] qlen
*/
int main(int argc,char** argv)
{
    // 子线程
    pthread_t threadchild;
    char* servename = "ftpserve";
    //子线程的属性
    pthread_attr_t attrofchild;
    //来自客户端的地址信息
    struct sockaddr_in clientinfo;
    //客户端地址信息结构大小
    unsigned int  lenofclientinfo;
    //从socket
    int slavesock;
    //控制管理结构
    CConsoleStats* consolestats = CConsoleStatsGetInstance();
    consolestats->mServeStats.port = MASTER_PORT;
    consolestats->mServeStats.qlen = QLEN;
    strcpy(&(consolestats->mServeStats.servename[0]),servename);

    printf("Serve starting...\n");
    switch(argc)
    {
    case 1:
        break;
    case 2:
        consolestats->mServeStats.port = atoi(argv[1]);
        break;
    case 3:
        consolestats->mServeStats.port = atoi(argv[1]);
        consolestats->mServeStats.qlen = atoi(argv[2]);
        break;
    default:
        errexit("usage:TCPFTP[port]\n");
        break;
    }

    //线程初始化
    (void)pthread_attr_init(&attrofchild);
    (void)pthread_attr_setdetachstate(&attrofchild,PTHREAD_CREATE_DETACHED);
    consolestats->MutexInit(consolestats);

    //创建常驻线程1,用于管理员命令输入与解析
    if(pthread_create(&threadchild,&attrofchild,(void*(*)(void*))ConsoleStatsMain,(void*)consolestats)<0)
        errexit("pthread_create(ConsoleStatsMain):%s\n",strerror(errno));

    //创建常驻线程2,用于获取管理员输入的命令
    if(pthread_create(&threadchild,&attrofchild,(void*(*)(void*))ConsoleStatsTransport,(void*)consolestats)<0)
        errexit("pthread_create(ConsoleStatsTransport):%s\n",strerror(errno));

    //主线程,用于接收来自客户的socket请求,并分配新的临时线程n处理客户请求.
    while(consolestats->isWorking(consolestats))
    {
        if(consolestats->isStarting(consolestats))
        {
            lenofclientinfo = sizeof(clientinfo);
            slavesock = accept(consolestats->mastersocket,(struct sockaddr*)&clientinfo,&lenofclientinfo);
            if(slavesock<0)
            {
                if(errno==EINTR)
                    continue;
                errexit("accept: %s\n",strerror(errno));
            }
            if(pthread_create(&threadchild,&attrofchild,(void*(*)(void*))FTPServicesMain,(void*) slavesock)<0)
                errexit("pthread_create: %s\n",strerror(errno));
        }
        else
            sleep(SLEEP_TIME);
    }

    if(-1!=consolestats->mastersocket)
    {
        consolestats->DoConsoleCloseServe(consolestats);
        printf("master socket close succeed!\n");
    }

    return 0;
}
